[初心者向け] IAMカスタムポリシーを最初から作る方法の一つ
大阪オフィスのちゃだいんです。
IAMのカスタムポリシーを1から作るぞってなったら、みなさんどうしてますか?
ポリシーを最初から作るの、なかなか骨が折れますよね。 今日は、私の作成方法を紹介してみようと思います。(もっといい方法があるって場合はこっそり教えてください)
要件
例えば、このようなIAMポリシーを作成したいとします。
- 対象はIAMユーザー
- AWS Systems Manager の Run Command の実行のみ許可
- 実行するコマンドのタイプを自己所有のドキュメントのみに限定し
- CLIでもマネジメントコンソールからでも可能
自己アカウント内のEC2に対して、すでに作成済みのスクリプトのみを実行する権限だけ与えたい。そんな場合と仮定します。
1. まず、類似したポリシーのサンプルが公式ドキュメントにないか検索する
これはいわゆる検索力が物を言います。
AWSドキュメントの中にはサービスごとにIAMポリシーのサンプルが記載されている場合があります。
そのユースケースが「これよくあるパターンやろうなぁ」って感じたら、一度探して見るとよいかもしれません。幸運なことに似たようなサンプルが見つかれば、それを加工するのが一番手っ取り早いと思います。
2. 対象サービスのフルアクセス管理ポリシーを複製する
類似サンプルがない場合、1から作るしかありません。
まず私が行うのは、AWS管理ポリシーで対象のサービスのフルアクセス権限をもつポリシーを検索します。
- マネジメントコンソールのIAMポリシーの画面にて、
SSM
と検索すると簡単に見つかります
- 今回の場合
AmazonSSMFullAccsess
を選択し、jsonの構文をまるっとコピペします
- 新しいポリシーを作成し、json部分にまるっと貼り付ければ、複製完了です
なぜフルアクセスポリシーから始めるのか?
AWSでは、実際行いたい単体サービスの機能に複数サービスのアクションが関連することがよくあります。
例えば今回のSSMのRunCommandをマネジメントコンソールから行いたい場合、SSMのRunCommandに関するアクション以外に、EC2一覧を表示するアクションec2:DescribeInstances
などが必要になります。なので、白紙の状態から積み上げていくより、フルアクセスからどこまでしぼれるのかを調べる方が、闇雲にならず早く最適な権限にたどり着けると考えるためです。
3. 複製したポリシーから不要なアクションを削除する
- 複製したポリシーの、アクセス権限タブの「ポリシー概要」を選択します
-
ご覧の通りSSMは多くのサービスが関係するので、権限にもそれが見て取れます
- 私の方法の場合、ここから「これはいらないだろう」と思われるアクションを削除していきます
-
同じ画面のポリシーの編集を押すと、実際にポリシーを追加・削除できる画面に遷移します
- ここからは勘になるのですが、まずはサービスレベルの断捨離をしていきます
-
要件に関係なさそうなサービスは削除します。今回の場合、結果SSMとEC2だけになりました
- サービスレベルでの断捨離の次は、アクションレベルでの断捨離です
-
SSMのアクションの中から、必要と思われるものを選んでいきます
- 原則としては、以下ドキュメントのサービス別のアクション一覧を参照しながら、必要なものだけを残す。といった作業になります
AWS のサービスのアクション、リソース、および条件キー - AWS Identity and Access Management
- 全てがそうとは限りませんが、多くの場合許可したい機能の名称がアクション名で使用されています
-
例えば今回の場合だと、
command
やdocument
で検索すると複数のアクションがヒットし、これらの取捨選択することで大方想定する権限を選定することができます
- 選定を終えたらポリシーの編集を保存します
4. 作成したポリシーをテストする
- 実際に期待通りの挙動になるかポリシーを使用してみます
-
今回の場合だと、IAMユーザーを想定しているので、実際にIAMユーザーを作成し、ポリシーをアタッチし、マネジメントコンソールにログインします
-
期待通りにならなかった場合、3.に戻りポリシーを修正します
-
あとは期待通りの挙動になるまで、3.と4.を繰り返し行います
終わりに
正直、泥臭いやり方ですが、IAMのアクションと実際のAPIオペレーションの関係性や、マネジメントコンソールやCLIとの関係性などが少しずつ見えてくるので、勉強にはなります。
もっと効率のいい方法をご存知の方がいたら教えてください。
どなたかの参考になれば幸いです。それではまた、大阪オフィスのちゃだいんでした。